"""
文件名：models.py
作者：教务系统开发团队
创建日期：2025-04-27
描述：用户认证模块的数据模型，定义用户、登录记录等数据表结构
"""
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.core.validators import RegexValidator

class Parent(AbstractUser):
    """
    家长用户模型
    
    字段说明：
        - user: 关联的Django内置用户
        - name: 家长姓名
        - gender: 性别(choices: ('M', '男'), ('F', '女'))
        - id_card: 身份证号(18位)
        - phone: 手机号(11位)
        - student_id: 关联学生的学号
        - student_name: 关联学生的姓名
        - student_id_card: 关联学生的身份证号
    """
    GENDER_CHOICES = (
        ('M', '男'),
        ('F', '女'),
    )
    
    # 关联Django内置用户模型，实现用户认证系统
    user = models.OneToOneField(
        'auth.User', 
        on_delete=models.CASCADE,
        related_name='parent',
        verbose_name='关联用户',
        help_text='关联Django内置用户模型'
    )
    
    name = models.CharField('姓名', max_length=50)
    gender = models.CharField('性别', max_length=1, choices=GENDER_CHOICES)
    id_card = models.CharField('身份证号', max_length=18, validators=[
        RegexValidator(
            regex='^\d{17}[0-9Xx]$',
            message='身份证号必须是18位数字或X结尾'
        )
    ])
    phone = models.CharField('手机号', max_length=11, validators=[
        RegexValidator(
            regex='^1[3-9]\d{9}$',
            message='手机号必须是11位数字且以1开头'
        )
    ])
    students = models.ManyToManyField(
        'students.Student', 
        verbose_name='关联学生',
        related_name='parents',
        help_text='一个家长可以关联多个学生',
        through='ParentStudentRelationship',
        through_fields=('parent', 'student')
    )
    
class ParentStudentRelationship(models.Model):
    """
    家长-学生关系中间模型
    
    字段说明：
        - parent: 关联的家长
        - student: 关联的学生
        - created_at: 关联创建时间
        - is_primary: 是否为主要监护人
    """
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE)
    student = models.ForeignKey('students.Student', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    is_primary = models.BooleanField(default=False)
    
    class Meta:
        unique_together = ('parent', 'student')
        verbose_name = '家长-学生关系'
        verbose_name_plural = '家长-学生关系'
    
    # 注册时验证的初始学生信息
    initial_student_id = models.CharField('初始验证学号', max_length=20, blank=True, null=True)
    initial_student_name = models.CharField('初始验证姓名', max_length=50, blank=True, null=True)
    initial_student_id_card = models.CharField('初始验证身份证号', max_length=18, blank=True, null=True)
    
    class Meta:
        verbose_name = '家长用户'
        verbose_name_plural = '家长用户'
    
    def __str__(self):
        return f'{self.name}({self.phone})'

class LoginRecord(models.Model):
    """
    登录记录模型
    """
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    login_time = models.DateTimeField('登录时间', auto_now_add=True)
    ip_address = models.GenericIPAddressField('IP地址')
    user_agent = models.CharField('用户代理', max_length=200)

    class Meta:
        verbose_name = '登录记录'
        verbose_name_plural = '登录记录'

    def __str__(self):
        return f'{self.user} 于 {self.login_time} 登录'